/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.model.service;

import com.context.conexion.EnahoConexion;
import com.model.dao.mapping.Enaho;
import com.model.dao.mapping.Enaho01;
import com.model.dao.mapping.Enaho01A;
import com.model.dao.mapping.Enaho01B;
import com.model.dao.mapping.Enaho02;
import com.model.dao.mapping.Enaho04;
import util.file.xml.TablaXml;
import com.model.domain.persona.HogarXml;
import com.model.domain.persona.HogarXmlTransferido;
import com.model.domain.proceso.envio.carga.ConjuntoControlesEnvioHogar;
import com.model.domain.proceso.envio.carga.ControlEnvioHogar;
import com.model.domain.proceso.envio.carga.LogXmlCargado;
import com.model.domain.proceso.envio.carga.ProcesoCarga;
import com.model.domain.proceso.envio.carga.ReglaEnvioHogar;
import com.model.domain.proceso.envio.carga.TipoCarga;
import com.model.domain.proceso.envio.subida.xml.TipoArchivoXmlEnaho;
import com.model.domain.proceso.envio.subida.LogXmlTransferido;
import com.model.domain.proceso.envio.subida.xml.ArchivoXmlEnaho;
import com.model.domain.proceso.envio.subida.xml.CampoXmlEnaho;
import com.model.domain.ubicacion.Conglomerado;
import com.model.domain.ubicacion.Vivienda;
import com.model.domain.ubicacion.ViviendaXml;
import java.sql.Connection;
import util.file.Archivo;
import util.file.xml.ArchivoXml;
import util.log.MiLogger;

/**
 *
 * @author rdelacruz
 */
public class DataXmlCampoService 
extends AbstractDataXmlService
{      
    //private Logger logger;
    
    private HogarService campo_HogarService;
    private ConglomeradoService conglomeradoService;
    private ViviendaService viviendaService;
    
    public DataXmlCampoService() {
        /*
        AppContext app = AppContext.getInstancia();        
        File file = new File(app.getEnahoProperties().getDirectorio_upload(),"cargaAutomatica.log");
        logger = LoggerUtil.getLoggerSimple("LogCargaAutomatica",file); 
                */
    }

    public HogarService getCampo_HogarService() {
        return campo_HogarService;
    }

    public void setCampo_HogarService(HogarService campo_HogarService) {
        this.campo_HogarService = campo_HogarService;
    }
       
    @Override
    protected TipoArchivoXmlEnaho getTipoArchivoXmlEnaho() {
        return TipoArchivoXmlEnaho.CAMPO;
    }   
   
    @Override
    protected void validacionArchivoXml(Connection con, MiLogger logger, ArchivoXmlEnaho arch, Archivo a) throws Exception {
        super.validacionArchivoXml(con, logger, arch, a);
        
        CampoXmlEnaho campoxml = (CampoXmlEnaho) arch;
                                
        //VALIDANDO CONGLOMERADO
        String codVivienda = null;
        String codConglomerado = null;
        TablaXml<HogarXml> tabla = campoxml.getTablaHogar();
        for(HogarXml hxml : tabla.getRegistros()) {
            codVivienda = hxml.getCodigoVivienda();
            codConglomerado = hxml.getCodigoConglomerado();
            Conglomerado c = conglomeradoService.findByCodigo(con, codConglomerado);
            if(c==null) {                                        
                Exception ex = new Exception("No existe en la base de datos el Conglomerado "+codConglomerado+". "
                        +"Falta cargar el marco de dicho conglomerado");
                //logger.loge(ex);
                //logger.logm("Falta cargar el marco de dicho conglomerado");
                throw ex;
                //return false;
            }
        }

        //VALIDANDO VIVIENDA
        Vivienda v = viviendaService.findByCodigo(con, codConglomerado, codVivienda);

        if(v==null) {                                
            TablaXml<ViviendaXml> tablaV = campoxml.getTablaVivienda();
            boolean faltaViviendaEnXml = false;

            if(tablaV.tieneRegistros()) {
                for(ViviendaXml vxml : tablaV.getRegistros()) {                                        
                    if(!codVivienda.equals(vxml.getVivienda())) {
                        faltaViviendaEnXml = true;
                        break;
                    }                                       
                }
            }
            else {
                faltaViviendaEnXml = true;
            }

            if(faltaViviendaEnXml) {
                Exception ex = new Exception("No existe en la base de datos la Vivienda "+codVivienda+" del Conglomerado "+codConglomerado+". "
                        +"El error se produce porque el archivo '"+a.getNombre()+"' no incluye a dicha vivienda");
                //logger.loge(ex);
                //logger.logm("El error se produce porque el archivo '"+a.getNombre()+"' no incluye a dicha vivienda");
                throw ex;
                //return false;
            }
        }
        
        //return true;
    }
    
    //CARGA MANUAL
    public void cargarDataXML_ManualDeRecuperacionEnvios(MiLogger logger, HogarXmlTransferido hxml, String usuario) throws Exception {
        ProcesoCarga p = new ProcesoCarga();
        p.setConControlEnvioHogar(false);
        p.setTipo(TipoCarga.MANUAL_RECUPERACION);
        p.setUsuario(usuario);
        p.setHogarParaCargar(hxml);//ESTO RESTRINGE PARA CARGAR SOLO ESTE HOGAR
        
        Connection con = null;        
        try {
            con = EnahoConexion.getConexion();
            logger.logd("CARGA MANUAL - RECUPERACION ENVIOS - INICIO");  
            
            Integer id = hxml.getViviendaXmlTransferido().getLogXmlTransferido().getId();
            LogXmlTransferido logxmlBd = this.getLogXmlTransferidoService().findById(con, id);
            
            //CARGANDO EL XML DE desde el XML de la BD
            String xmlData = logxmlBd.getDataXml();            
            ArchivoXml archivoXml = new ArchivoXml(xmlData);                    
            CampoXmlEnaho arch = (CampoXmlEnaho) ArchivoXmlEnaho.parsear(archivoXml);
            logxmlBd.setArchivoXmlEnaho(arch);            
            logxmlBd.setOperacionSubida(logxmlBd.getOperacionSubida());       
            
            cargarDataXML_unSoloArchivo(p,con,logger,logxmlBd);
        } finally {
            if(con!=null) con.close();
            logger.logd("CARGA MANUAL - RECUPERACION ENVIOS - FIN");                        
        }
    }    

    /**
     * Define en qué tablas se van a cargar los datos
     * @param con
     * @param logger
     * @param logxmlcargado
     * @throws Exception 
     */
    @Override
    protected void cargarDataXML(Connection con, MiLogger logger, LogXmlCargado logxmlcargado) throws Exception { 
        //logger.logd("cargarDataXML campo");
        
        LogXmlTransferido logxml = logxmlcargado.getLogXmlTransferido();
        
        logger.logd("Se cargará "+logxml.getOperacionSubida().getArchivo().getUrl() + " (id="+logxml.getId()+")");
        
        verificarSiTablasXML_TablasSQL_tienenMismoNombre(con, logger,logxml);        
        
        ConjuntoControlesEnvioHogar hogares = crearHogaresParaCargar(logger,con,logxmlcargado);        
        logxmlcargado.setHogaresParaCargar(hogares);
                    
        //TABLAS QUE SE CARGAN SIN RESTRICCIONES
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho.VIVIENDA.getTabla(),true);//se carga sin restricciones        
        
        //TABLAS QUE SE CARGAN CON RESTRICCIONES
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho.HOGAR.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho.VISITA_ENCUESTADOR.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_100.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_100A.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_100B.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_200.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_600.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_601.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_602.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_602A.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_603.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_604.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_605.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_606.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_606D.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_607.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_609.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_610.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_611.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_612.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_612A.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_700A.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_700B.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_700C.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_700D.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_800A.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.CAP_800B.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.FECHA_VISITA.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.OBSERVACIONES.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.OTROS_HOGAR.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01.OTROS_PRODUCTO.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01A.CAP_300.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01A.CAP_300_A.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01A.CAP_300A.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01A.CAP_400.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01A.CAP_400A.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01A.CAP_500.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01A.CAP_500A.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01A.CAP_500B.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01A.CAP_500C.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01A.CAP_500D.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01A.CAP_500E.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01A.OSERVACIONES_PERSONA.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01A.OTROS_PERSONA.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01B.B_A.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01B.B_B.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01B.B_C.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho01B.PERSONA.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho02.CAP_2000.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho02.CAP_2000A.getTabla());              
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho02.CAP_2100.getTabla());              
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho02.CAP_2200.getTabla());              
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho02.CAP_2300.getTabla());              
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho02.CAP_2400.getTabla());              
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho02.CAP_2500.getTabla());              
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho02.CAP_2600.getTabla());              
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho02.CAP_2700.getTabla());              
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho02.FECHA_VISITA.getTabla());              
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho02.NOTA.getTabla());              
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho02.OBSERVACION.getTabla());              
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho02.OTROS.getTabla());              
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho04.CAP_1.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho04.CAP_2.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho04.CAP_3.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho04.CAP_4.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho04.FECHA_VISITA.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho04.OBSERVACION.getTabla());
        cargarDataXML_Tabla(con,logger,logxmlcargado,Enaho04.OTROS.getTabla());
        
    }
    
    

    private ConjuntoControlesEnvioHogar crearHogaresParaCargar(MiLogger logger, Connection con, LogXmlCargado logxmlcargado) throws Exception {
        ConjuntoControlesEnvioHogar hogares = new ConjuntoControlesEnvioHogar();
        CampoXmlEnaho campoXml = (CampoXmlEnaho) logxmlcargado.getLogXmlTransferido().getArchivoXmlEnaho();
        TablaXml<HogarXml> tablaHogarXml = new TablaXml<HogarXml>();
        campoXml.parsearHogar(tablaHogarXml);
        
        ProcesoCarga proc = logxmlcargado.getProcesoCarga();        
            
        campo_HogarService.findResultadoFinalByTablaHogarXML(con, tablaHogarXml);
        
        for(HogarXml r : tablaHogarXml.getRegistros()) {
            ReglaEnvioHogar regla = new ReglaEnvioHogar();
            regla.setHogarXml(r);
            logger.logd(regla.getMensaje());
            
            boolean agregarHogar = false;           
                        
            if(proc.getTipo()==TipoCarga.MANUAL_RECUPERACION) {
                //Si hay un hogar designado, solo carga ese hogar
                HogarXmlTransferido ht = proc.getHogarParaCargar();
                if(ht!=null && ht.esIgualEnCodigoA(regla.getHogarXml())) {
                    agregarHogar = true;
                }
            }
            else {
                //Se cargan todos los hogares de la vivienda
                agregarHogar = true;
            }
            
            if(agregarHogar) {
                ControlEnvioHogar control = new ControlEnvioHogar();
                control.setReglaEnvioHogar(regla);
                hogares.addControlEnvioHogar(control); 
            }
        }
        
        return hogares;
    }

    public ConglomeradoService getConglomeradoService() {
        return conglomeradoService;
    }

    public void setConglomeradoService(ConglomeradoService conglomeradoService) {
        this.conglomeradoService = conglomeradoService;
    }

    public ViviendaService getViviendaService() {
        return viviendaService;
    }

    public void setViviendaService(ViviendaService viviendaService) {
        this.viviendaService = viviendaService;
    }
    

      
}
